\begin{lstlisting}[frame=shadowbox, language=C, numbers=left, breaklines=true, basicstyle=\footnotesize]
#include "Errores.h"
#include "Archivo.h"
#include "Controlar.h"
#include "Imprimir_stdin.h"
#include "Ayuda.h"
#include <getopt.h>

void cargar_stdin();
int procesarArchivo ( const char* nombre );

int main(int argc, char** argv)
{
   int next_option;

   const char* const short_options = "hV";
   const struct option long_options[] = {
   { "help"   , 0, NULL, 'h' },
   { "version"   , 0, NULL, 'V' },
   { NULL, 0, NULL, 0 } };


   do {
      next_option = getopt_long (argc, argv, short_options, long_options, NULL);

      switch (next_option)
      {
         case 'h':
            mostrarAyuda( argv[0] );
            exit(0);
         case 'V':
            mostrarVersion();
            exit(0);
         case '?': //opcion invalida
            mostrarAyuda( argv[0] );
            exit(0); //no lo consideramos error
         case -1: 
            break;
         default:
            break;
      }

   } while (next_option != -1);


   int retorno = 0;

   switch ( argc )
   {
   case 1:
   {
      cargar_stdin();
      break;
   }
   case 2:
   {
      retorno = procesarArchivo ( argv[1] );
      break;
   }
   default:
   {
      int i, cantArchivos;

      cantArchivos = argc - 1;

      for ( i = 1; i <= cantArchivos; i ++ )
      {

         if ( procesarArchivo ( argv[i] ) != 0 )
            retorno = 1;
      }
      break;
   }
   }

    return retorno;
}

int procesarArchivo ( const char* nombre )
{
   if ( is_regular ( nombre ) !=0 )
   {
      escribirArchAlReves ( nombre );
      return 0;
   }
   else
   {
      return 1;
   }
}

void cargar_stdin() {
   long lSize = 20;
   void* bufferAux=NULL;
   void * buffer=NULL;
   int result;
   int tamanoAcumulado = 0;

   bufferAux =  malloc (sizeof(char)*(lSize));
   if (bufferAux==NULL) {
      mem_error();
   }

   buffer =  malloc (sizeof(char)*(lSize));
   if (buffer==NULL){
      free(bufferAux);
      mem_error();
   }

   memset(bufferAux, 0, lSize);
   memset(buffer, 0, lSize);

   result = fread(bufferAux, sizeof(char),lSize, stdin);

   if (result>0) {
      memcpy(buffer,bufferAux,result);
      tamanoAcumulado += result;
   }


   while( !feof(stdin) ) {
      memset(bufferAux, 0, lSize);
      result = fread(bufferAux, sizeof(char), lSize, stdin);
      buffer = realloc (buffer, sizeof(char)*(tamanoAcumulado+result));
      if (buffer == NULL) {
         free(bufferAux);
         mem_error();
      }
      void* aux = buffer+tamanoAcumulado;
      memcpy(aux,bufferAux,result);
      tamanoAcumulado +=  result;
   }

   int res = imprimir_lineas_buffer(buffer,tamanoAcumulado);
   free (buffer);
   free (bufferAux);
   if (res==-1)
      write_error();

}
\end{lstlisting}
